package com.mjk.manager.magicapi.core.modules.db.dialect;


import com.mjk.manager.magicapi.core.modules.db.BoundSql;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.regex.Pattern;

/**
 * 数据库方言接口
 *
 * @author mxd
 */
public interface Dialect {

    Pattern REPLACE_ORDER_BY = Pattern.compile("order\\s+by\\s+[^,\\s]+(\\s+asc|\\s+desc)?(\\s*,\\s*[^,\\s]+(\\s+asc|\\s+desc)?)*", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

    /**
     * 根据jdbcUrl匹配
     *
     * @param jdbcUrl jdbc链接
     * @return 是否匹配
     */
    default boolean match(String jdbcUrl) {
        return false;
    }

    /**
     * 根据Connection匹配
     *
     * @param connection jdbc连接
     * @return 是否匹配
     * @throws SQLException 匹配失败时抛出的异常
     */
    default boolean match(Connection connection) throws SQLException {
        return match(connection.getMetaData().getURL());
    }

    /**
     * 获取查总数的sql
     *
     * @param sql 原始SQL
     * @return 分页 count SQL
     */
    default String getCountSql(String sql) {
        return "select count(1) from ( \n" + REPLACE_ORDER_BY.matcher(sql).replaceAll("") + "\n ) count_";
    }

    /**
     * 获取分页sql
     *
     * @param sql      原始SQL
     * @param boundSql boundSql对象
     * @param offset   跳过条数
     * @param limit    限制条数
     * @return 返回分页SQL
     */
    String getPageSql(String sql, BoundSql boundSql, long offset, long limit);
}
